﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using _1.Presentacion.Utilidades;
using _2.Logica.Seguirdad;
using _4.Modelado.Seguridad;
using _1.Presentacion.Principal;

namespace _1.Presentacion.Modulo_Seguridad
{
    public partial class Gestionar_Perfiles : Päntalla_Base
    {   //Indica si Edita o Inserta
        private int iAccion = 0;
        
        public Gestionar_Perfiles()
        {
            InitializeComponent();
  
        }
      
      
        private void P_Limpiar()
        {
            txtPerfilDescrp.Clear();
            txtPerfilNombre.Clear();
            txtPKPerfil.Text = "0";
        }

      

        #region Carga Datos
        public void CargaGridPerfiles()
        {
            try
            {
                var logica = new PerfilL();

                List<Perfil> listaPerfiles = logica.ConsultarPerfiles();
                dgvPerfiles.Rows.Clear();
                for (int i = 0; i < listaPerfiles.Count; i++)
                {

                    dgvPerfiles.Rows.Add();
                    dgvPerfiles.Rows[i].Cells[0].Value = listaPerfiles[i].iPK_Perfil;
                    dgvPerfiles.Rows[i].Cells[1].Value = listaPerfiles[i].sPerfilNombre;
                    dgvPerfiles.Rows[i].Cells[2].Value = listaPerfiles[i].sPerfilDescripcion;
                }

            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar la lista de Perfiles " + exc, "Error", MessageBoxButtons.OK);
            }
        }

        public void CargaPermisosInicial()
        {
            tvPermisos.Nodes.Clear();
            var logica = new PermisoL();
            List<Permiso> listaPermisos = logica.ConsultarPermiso();
            TreeNode nodoPapa = null;
            string ultimoPapa = "";

            for (int i = 0; i < listaPermisos.Count; i++)
            {
                if (ultimoPapa != listaPermisos[i].sModulo)
                {
                    nodoPapa = new TreeNode(listaPermisos[i].sModulo);
                   nodoPapa.NodeFont = new Font(tvPermisos.Font, FontStyle.Italic);
 

                    TreeNode nodoHijo = new TreeNode(listaPermisos[i].sPermisoNombre.ToString());
                    nodoHijo.Tag = listaPermisos[i].iPKPermiso.ToString();
                    nodoPapa.Nodes.Add(nodoHijo);

                    tvPermisos.Nodes.Add(nodoPapa);
                    ultimoPapa = listaPermisos[i].sModulo;


                }
                else
                {
                    TreeNode nodoHijo = new TreeNode(listaPermisos[i].sPermisoNombre.ToString());
                    nodoHijo.Tag = listaPermisos[i].iPKPermiso.ToString();
                    nodoPapa.Nodes.Add(nodoHijo);
                }
            }
        }

        public void CargaEstadoPermisos(int CodPerfil)
        {
            try
            {

                var logica = new PermisoL();
                List<Permiso> listaPermisos = logica.ConsultarEstadoPermiso(CodPerfil);

                TreeNode nodoPapa = null;
                string ultimoPapa = "";

                for (int i = 0; i < listaPermisos.Count; i++)
                {
                    if (ultimoPapa != listaPermisos[i].sModulo)
                    {
                        nodoPapa = new TreeNode(listaPermisos[i].sModulo);
                        nodoPapa.ExpandAll();


                        TreeNode nodoHijo = new TreeNode(listaPermisos[i].sPermisoNombre.ToString());
                        nodoHijo.Tag = listaPermisos[i].iPKPermiso.ToString();
                        nodoHijo.Checked = listaPermisos[i].bEstado;
                        nodoPapa.Nodes.Add(nodoHijo);

                        tvPermisos.Nodes.Add(nodoPapa);
                        ultimoPapa = listaPermisos[i].sModulo;

                    }
                    else
                    {
                        TreeNode nodoHijo = new TreeNode(listaPermisos[i].sPermisoNombre.ToString());
                        nodoHijo.Tag = listaPermisos[i].iPKPermiso.ToString();
                        nodoHijo.Checked = listaPermisos[i].bEstado;
                        nodoPapa.Nodes.Add(nodoHijo);
                    }
                }
            }
            catch (Exception exc)
            {

                MessageBox.Show(" Se produjo un error" + exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }




        #endregion

        #region Guarda Datos del arbol
        /// <summary>
        /// Guarda el estado de los permisos para cada perfil
        /// solamente los que esten marcados van a guardarse 
        /// </summary>
        /// <param name="idPerfil">código de Perfil </param>
        public void GuardaPermisos(int idPerfil)
        {


            TreeNodeCollection nodes = tvPermisos.Nodes;

            //Recorre los nodos padres(Nombres de modulos)
            foreach (TreeNode n in nodes)
            {
                if (n.FirstNode != n.LastNode)
                {
                    //Crea una coleccion de nodos hijos
                    TreeNodeCollection nodoHijos = n.Nodes;

                    foreach (TreeNode hijo in nodoHijos)
                    {
                        var obj = new Permiso();
                        if (hijo.Checked)
                        {

                            obj.iFKPerfil = idPerfil;
                            obj.iPKPermiso = Convert.ToInt32(hijo.Tag);
                            obj.bEstado = hijo.Checked;

                            var logica = new PermisoL();
                            logica.InsertarPerfilPermiso(obj);
                        }
                        else
                        {
                            {
                                //var obj = new Permiso();
                                obj.iFKPerfil = idPerfil;
                                obj.iPKPermiso = Convert.ToInt32(hijo.Tag);
                                obj.bEstado = hijo.Checked;

                                var logica = new PermisoL();
                                logica.EliminarPerfilPermiso(obj);
                            }

                        }

                    }
                }




            }
        }

        public void ActualizaEstadoPermisos(int idPerfil)
        {
            //Almacena el codPErfil para luego enviarlo


            var logicap = new PermisoL();
            List<Permiso> listaPermisos = logicap.ConsultarEstadoPermiso(idPerfil);

            TreeNodeCollection nodes = tvPermisos.Nodes;

            //Recorre los nodos padres(Nombres de modulos)
            foreach (TreeNode nodo in nodes)
            {
                if (nodo.FirstNode != nodo.LastNode)
                {
                    //Crea una coleccion de nodos hijos
                    TreeNodeCollection nodoHijos = nodo.Nodes;
                    for (int i = 0; i < nodoHijos.Count; i++)
                    {
                        for (int j = 0; j < listaPermisos.Count; j++)
                        {
                            if (listaPermisos[j].iPKPermiso == Convert.ToInt32(nodoHijos[i].Tag))
                            {
                                //Compara los estados de los permisos
                                if (listaPermisos[j].bEstado != nodoHijos[i].Checked)
                                {
                                    //Si el estado = checked entonces activa el nuevo permiso

                                    if (nodoHijos[i].Checked)
                                    {
                                        var obj = new Permiso();
                                        obj.iFKPerfil = idPerfil;
                                        obj.iPKPermiso = Convert.ToInt32(nodoHijos[i].Tag);
                                        obj.bEstado = nodoHijos[i].Checked;

                                        var logica = new PermisoL();
                                        logica.InsertarPerfilPermiso(obj);
                                    }
                                    //Si el estado = unchecked entonces elimina el  permiso
                                    else
                                    {
                                        var obj = new Permiso();
                                        obj.iFKPerfil = idPerfil;
                                        obj.iPKPermiso = Convert.ToInt32(nodoHijos[i].Tag);

                                        var logica = new PermisoL();
                                        logica.EliminarPerfilPermiso(obj);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        
        #endregion
       
   



 
        

        private void Gestionar_Perfiles_Load(object sender, EventArgs e)
        {

            txtPKPerfil.Text = "0";
            CargaGridPerfiles();
            CargaPermisosInicial();
            Validaciones.CargarUsuarioLogueado(lbl_usaurio, lbl_Fecha);
          
            


           
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            P_Limpiar();
        }

        private void btnHom_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if((txtPerfilNombre.Text != string.Empty || txtPerfilNombre.Text != "")&&
                (txtPerfilDescrp.Text != string.Empty || txtPerfilDescrp.Text != ""))
                {

                    #region Inserta Perfil
                    try
                    {
                        var p = new Perfil();
                        p.sPerfilNombre = txtPerfilNombre.Text;
                        p.sPerfilDescripcion = txtPerfilDescrp.Text;
                        p.iPK_Perfil = Convert.ToInt32(txtPKPerfil.Text);


                        var logica = new PerfilL();
                        int idPerfil = logica.GuardarPerfil(p);
    
                
                        if(iAccion!=1)//Inserta por primera vez el estado de los permisos
                        {
                            GuardaPermisos(idPerfil);
                     
                            CargaPermisosInicial();
                        }
                        else//Actualiza Estado de los permisos
                        {
                            ActualizaEstadoPermisos(idPerfil);
                            CargaPermisosInicial();
                    
                        }

                        P_Limpiar();

                        MessageBox.Show("El registro ha sido guardado", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        CargaPermisosInicial();
                        CargaGridPerfiles();
                    
                    }

                    catch (Exception exc)
                    {

                        MessageBox.Show(" No se pudo insertar el registro" + exc.Message, "Error", MessageBoxButtons.OK,MessageBoxIcon.Error);
                    }
                    #endregion

                }
                else
                    MessageBox.Show("LLene todos los campos" , "Error", MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }
            catch (Exception)
            {
                    
                throw;
            }
        }

        private void dgvPerfiles_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            iAccion = 1;
            int indicefila = dgvPerfiles.SelectedCells[0].RowIndex;
            txtPKPerfil.Text = dgvPerfiles.Rows[indicefila].Cells[0].Value.ToString();
            txtPerfilNombre.Text = dgvPerfiles.Rows[indicefila].Cells[1].Value.ToString();
            txtPerfilDescrp.Text = dgvPerfiles.Rows[indicefila].Cells[2].Value.ToString();
            tvPermisos.Nodes.Clear();
            CargaEstadoPermisos(Convert.ToInt32(txtPKPerfil.Text));

        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvPerfiles.RowCount > 0)
                {
                    int indiceFila = dgvPerfiles.SelectedCells[0].RowIndex;
                    string sNombre = dgvPerfiles[1, indiceFila].Value.ToString();


                    #region Elimina Perfil

                    DialogResult r = MessageBox.Show("Desea eliminar el perfil: " + sNombre, "Validaciones",
                                                     MessageBoxButtons.OK, MessageBoxIcon.Question);

                    if (r == DialogResult.OK)
                    {
                        var obj = new Perfil();
                        obj.iPK_Perfil = Convert.ToInt32(dgvPerfiles.Rows[indiceFila].Cells[0].Value);

                        var logica = new PerfilL();
                        logica.EliminarPerfil(obj);
                        MessageBox.Show("El registro ha sido eliminado", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        CargaGridPerfiles();
                        P_Limpiar();
                        

                    }

                    #endregion
                }
            }
            catch (Exception exc)
            {
                if (exc.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                {
                    MessageBox.Show("El perfil tiene permisos asociados, asegurese de que no tenga permisos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("No se pudo eliminar el registro " + exc, "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                }
                
            }
        }

      

       
    }
}
